/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.TratamientoYPracticaFisica;
import hibernate.objeto.BalanceHidroelectrolitico;
import hibernate.objeto.CuidadoCuidadoYMedicion;
import hibernate.objeto.CuidadoDeInternacion;
import hibernate.objeto.CuidadoYMedicion;
import hibernate.objeto.DiagnosticoYTriageInternacion;
import hibernate.objeto.EgresoBalanceHidroelectrolitico;
import hibernate.objeto.IngresoBalanceHidroelectrolitico;
import hibernate.objeto.ProfesionalTratamientoQuirurgico;
import hibernate.objeto.TratamientoQuirurgico;
import hibernate.objeto.TratamientoYPractica;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Vector;
import presentacion.CapaPresentacion;

/**
 *
 * @author Rafael
 */
public class TratamientoYPracticaLogica extends CapaLogica{

    /**
     * Crea y persiste el tratamiento para el paciente.
     *
     * @param datosTratamientoYPractica Los datos correspondientes al tratamiento
     * @param tratamientoYPractica El tratamiento que se esta agregando/modificando
     * @param paciente El paciente a quien se le carga el tratamiento
     * @param idObjetoCreado El id del objeto creado para su posterior recuperación
     * @return true si se agregó correctamente, false en caso contrario
     */
    public static boolean agregarTratamientoYPractica(
            Object[] datosTratamientoYPractica,
            TratamientoYPractica tratamientoYPractica,
            int[] idObjetoCreado, DiagnosticoYTriageInternacion
            diagnosticoYTriageInternacion) {

            //Si es una modificacion
            if (idObjetoCreado[0] != -1) {
                //Escribe el log
                backUpModificacion(idObjetoCreado[0]);
                //Quita los objetos asociados
                quitarObjetosAsociados(tratamientoYPractica);                
            }

        tratamientoYPractica = crearObjetoTratamientoYPractica(
                datosTratamientoYPractica, tratamientoYPractica);
        tratamientoYPractica.
                setDiagnosticoYTriageInternacion(diagnosticoYTriageInternacion);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(tratamientoYPractica)) {
            idObjetoCreado[0] = tratamientoYPractica.getIdTratamientoYPractica();
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea un objeto TratamientoYPractica con los datos pasados por parámetro.
     *
     * @param datosTratamientoYPractica Los datos a cargar
     * @param tratamientoYPractica  El tratamiento que se esta creando/obteniendo
     * internacion a quien se le carga el tratamiento
     * @return El objeto TratamientoYPractica creado
     */
    private static TratamientoYPractica crearObjetoTratamientoYPractica(
            Object[] datosExamenComplementario,
            TratamientoYPractica tratamientoYPractica){

        if (tratamientoYPractica == null) {
            tratamientoYPractica = new TratamientoYPractica();
        }
        

        tratamientoYPractica.setHoraTratamientoYPractica(
                datosExamenComplementario[
                TRATAMIENTO_Y_PRACTICA_HORA].toString());

        tratamientoYPractica.setFechaTratamientoYPractica(
                (Date) datosExamenComplementario[
                TRATAMIENTO_Y_PRACTICA_FECHA]);

        return tratamientoYPractica;
    }

    /**
     * Retorna el objeto TratamientoYPractica según el id.
     *
     * @param idTratamientoYPractica El id del tratamiento
     * @return El objeto TratamientoYPractica consultado, null si no existe
     */
    public static TratamientoYPractica getTratamientoYPracticaPorId(
            int idTratamientoYPractica) {
        return TratamientoYPracticaFisica.getTratamientoYPracticaPorId(
                idTratamientoYPractica);
    }

    /**
     * Retorna el vector de objetos TratamientoYPractica correspondientes a un
     * diagnostico y triage.
     *
     * @param idDiagnosticoYTriageInternacion El id del diagnostico y triage
     * consultado
     * @return El vecotr de objetos TratamientoYPractica consultado, null si
     * no existe
     */
    public static Vector<TratamientoYPractica>
            getVectorTratamientoYPracticaPorIdDiagnosticoYTriageInternacion(
            int idDiagnosticoYTriageInternacion) {
        return TratamientoYPracticaFisica.
                getVectorTratamientoYPracticaPorIdDiagnosticoYTriageInternacion(
                idDiagnosticoYTriageInternacion);
    }

    /**
     * Retorna el vector de objetos TratamientoYPractica correspondientes a un
     * paciente.
     *
     * @param idPaciente El id del paciente
     * @return El vecotr de objetos TratamientoYPractica consultado, null si
     * no existe
     */
    public static Vector<TratamientoYPractica>
            getVectorTratamientoYPracticaPorIdPaciente(
            int idPaciente) {
        return TratamientoYPracticaFisica.
                getVectorTratamientoYPracticaPorIdPaciente(
                idPaciente);
    }

    /**
     * Quita los objetos asociados al tratamiento y práctica de
     * manera fisica y logica.
     *
     * @param tratamientoYPractica El tratamiento y práctica al cual se le quitaran
     * los objetos relacionados
     */
    private static void quitarObjetosAsociados(TratamientoYPractica
            tratamientoYPractica) {
        //se quitan los estudios anteriores a la carga o modificacion
        if (tratamientoYPractica.getCuidadoDeInternacion() != null) {
            if (tratamientoYPractica.getCuidadoDeInternacion().
                    getBalanceHidroelectrolitico() != null) {
                //Obtengo todos los ingresos
                Vector<IngresoBalanceHidroelectrolitico>
                        vectorIngresoBalanceHidroelectrolitico =
                        IngresoBalanceHidroelectroliticoLogica.
                        getVectorIngresoBalanceHidroelectroliticoPorIdBalanceHidroelectrolitico(
                        tratamientoYPractica.getCuidadoDeInternacion().
                        getBalanceHidroelectrolitico().getIdBalanceHidroelectrolitico());
                if(vectorIngresoBalanceHidroelectrolitico != null) {
                //Quito los ingresos del objeto asociado y las elimino de
                //la bd
                tratamientoYPractica.getCuidadoDeInternacion().
                    getBalanceHidroelectrolitico().setIngresoBalanceHidroelectroliticos(null);
                CapaFisica.deleteAll(vectorIngresoBalanceHidroelectrolitico);
                }
                //Obtengo todos los egresos
                Vector<EgresoBalanceHidroelectrolitico>
                        vectorEgresoBalanceHidroelectrolitico =
                        EgresoBalanceHidroelectroliticoLogica.
                        getVectorEgresoBalanceHidroelectroliticoPorIdBalanceHidroelectrolitico(
                        tratamientoYPractica.getCuidadoDeInternacion().
                        getBalanceHidroelectrolitico().getIdBalanceHidroelectrolitico());
                if(vectorEgresoBalanceHidroelectrolitico != null) {
                //Quito los egresos del objeto asociado y las elimino de
                //la bd
                tratamientoYPractica.getCuidadoDeInternacion().
                    getBalanceHidroelectrolitico().setEgresoBalanceHidroelectroliticos(null);
                CapaFisica.deleteAll(vectorEgresoBalanceHidroelectrolitico);
                }

                //Se quita el balance hidroelectrolitico al tratamientoYPractica y se lo
                //elimina de la bd
                BalanceHidroelectrolitico balanceHidroelectrolitico =
                        tratamientoYPractica.getCuidadoDeInternacion().
                        getBalanceHidroelectrolitico();
                tratamientoYPractica.getCuidadoDeInternacion().
                        setBalanceHidroelectrolitico(null);

                CapaFisica.eliminarObjeto(balanceHidroelectrolitico);

            } else {
                //Obtengo todos los cuidados
                Vector<CuidadoCuidadoYMedicion>
                        vectorCuidadoCuidadoYMedicion =
                        CuidadoCuidadoYMedicionLogica.
                        getVectorCuidadoCuidadoYMedicionPorIdCuidadoYMedicion(
                        tratamientoYPractica.getCuidadoDeInternacion().
                        getCuidadoYMedicion().getIdCuidadoYMedicion());
                if (vectorCuidadoCuidadoYMedicion != null) {
                //Quito los cuidados del objeto asociado y las elimino de
                //la bd
                tratamientoYPractica.getCuidadoDeInternacion().
                        getCuidadoYMedicion().setCuidadoCuidadoYMedicions(null);
                CapaFisica.deleteAll(vectorCuidadoCuidadoYMedicion);
                }

                //Se quita cuidadoYmedicion al cuidado de internacion y se lo
                //elimino de la bd
                CuidadoYMedicion cuidadoYMedicion =
                        tratamientoYPractica.getCuidadoDeInternacion().getCuidadoYMedicion();
                tratamientoYPractica.
                        getCuidadoDeInternacion().setCuidadoYMedicion(null);

                CapaFisica.eliminarObjeto(cuidadoYMedicion);
            }

                //Se quita el cuidado de internacion al tratamientoYPractica y se lo
                //elimina de la bd
                CuidadoDeInternacion cuidadoDeInternacion =
                        tratamientoYPractica.getCuidadoDeInternacion();
                tratamientoYPractica.setCuidadoDeInternacion(null);

                CapaFisica.eliminarObjeto(cuidadoDeInternacion);

        } else if (tratamientoYPractica.getTratamientoQuirurgico() != null) {
            //Obtengo todas los profesionales asociados al tratamiento quirúrgico
            Vector<ProfesionalTratamientoQuirurgico>
                vectorProfesionales =
                ProfesionalTratamientoQuirurgicoLogica.
                getVectorProfesionalTratamientoQuirurgicoPorIdTratamientoQuirurgico(
                tratamientoYPractica.getTratamientoQuirurgico().getIdTratamientoQuirurgico());
                //Quito los profesionales del objeto asociado y los elimino de
                //la bd
                if (vectorProfesionales != null) {
                tratamientoYPractica.getTratamientoQuirurgico().
                        setProfesionalTratamientoQuirurgicos(null);
                CapaFisica.deleteAll(vectorProfesionales);
                }
            //Se quita el tratamiento quirurgico y se lo
            //elimina  de la bd
            TratamientoQuirurgico tratamientoQuirurgico =
                    tratamientoYPractica.getTratamientoQuirurgico();
            tratamientoYPractica.setTratamientoQuirurgico(null);

            CapaFisica.eliminarObjeto(tratamientoQuirurgico);
        }
    }

    /**
     * Escribe un archivo de texto el cual es una imagen del objeto que se
     * ha modificado y sus objetos asociados, guardando el mismo en la tabla.
     *
     * @param idObjeto El id del objeto a resguardar
     */
    private static void backUpModificacion(int idObjeto) {
        String rutaLogLocal = DIRECTORIO_DE_TRABAJO + "\\" +
                    TratamientoYPractica.class.getName() + ".txt";
        //Se recupera el objeto para recupera el archivo
        TratamientoYPractica tratamientoYPractica =
                TratamientoYPracticaLogica.
                getTratamientoYPracticaPorId(idObjeto);
        File log = CapaLogica.byteArrayToFile(rutaLogLocal,
                tratamientoYPractica.getArchivoLogTratamientoYPractica());

        if (log == null) {
            log = new File(rutaLogLocal);
        }

        //Se manipula el log
        escribirLogTratamientoYPractica(tratamientoYPractica, rutaLogLocal);

        //Se guarda
        byte[] bFile = new byte[(int) log.length()];

        try {
            FileInputStream fileInputStream = new FileInputStream(log);
            //convert file into array of bytes
            fileInputStream.read(bFile);
            fileInputStream.close();
        } catch (Exception exc) {
            System.err.println(exc.getMessage());
        }

        //Setea el adjunto
        tratamientoYPractica.setArchivoLogTratamientoYPractica(bFile);
        eliminarArchivosTemporales();
    }

    /**
     * Escribe el objeto en un archivo.
     *
     * @param tratamientoYPractica  El objeto a resguardar
     * @param log El archivo en donde escribir
     * @return true si se escribio correctamente, false en caso contrario
     */
    public static boolean escribirLogTratamientoYPractica(
            TratamientoYPractica tratamientoYPractica, String rutaLog) {
        try {
            //ExamenComplementario
            String examenComplementarioString = getTratamientoYPracticaString(
                    tratamientoYPractica);

            BufferedWriter bw = new BufferedWriter(new FileWriter(rutaLog, true));
            examenComplementarioString += "\n" + SEPARADOR + "\n";
            //Escribe los datos del objeto
            bw.write(examenComplementarioString);

            bw.close();
        } catch (IOException exception) {
            System.err.println(exception.getMessage());
            return false;
        }

        return true;
    }

    /**
     * Retorna todo el objeto TratamientoYPractica en String.
     *
     * @param tratamientoYPractica   El objeto a escribir
     */
    public static String getTratamientoYPracticaString(
            TratamientoYPractica tratamientoYPractica) {

        String tratamientoYPracticaString =
                    "idTratamientoYPractica: " +
                    tratamientoYPractica.getIdTratamientoYPractica() + "\n" +
                    "diagnosticoYTriageInternacion: " +
                    tratamientoYPractica.getDiagnosticoYTriageInternacion() + "\n" +
                    "fechaTratamientoYPractica: " +
                    tratamientoYPractica.getFechaTratamientoYPractica() + "\n" +
                    "horaTratamientoYPractica: " +
                    tratamientoYPractica.getHoraTratamientoYPractica() + "\n";

        if (tratamientoYPractica.getTratamientoQuirurgico() != null) {
            tratamientoYPracticaString +=
                    TratamientoQuirurgicoLogica.getTratamientoQuirurgicoString(
            tratamientoYPractica.getTratamientoQuirurgico());
        } else if (tratamientoYPractica.getCuidadoDeInternacion() != null) {
            tratamientoYPracticaString +=
                    CuidadoDeInternacionLogica.getCuidadoDeInternacionString(
            tratamientoYPractica.getCuidadoDeInternacion());
        }
        return tratamientoYPracticaString;
    }

    /**
     * Retorna todo el objeto TratamientoYPractica en HTML.
     *
     * @param tratamientoYPractica   El objeto a escribir
     */
    public static String getTratamientoYPracticaHTML(
            TratamientoYPractica tratamientoYPractica) {
        String tratamientoYPracticaHTML = "";
        String tratamientoQuirurgicoHTML = "";
        String cuidadoDeInternacionHTML = "";

        if (tratamientoYPractica != null) {

            if (tratamientoYPractica.getTratamientoQuirurgico() != null) {
                tratamientoQuirurgicoHTML += "</font><br><br><hr /><hr /><br>";
                tratamientoQuirurgicoHTML +=
                        TratamientoQuirurgicoLogica.getTratamientoQuirurgicoHTML(
                        tratamientoYPractica.getTratamientoQuirurgico());
            } else if (tratamientoYPractica.getCuidadoDeInternacion() != null) {
                cuidadoDeInternacionHTML += "</font><br><br><hr /><hr /><br>";
                cuidadoDeInternacionHTML +=
                        CuidadoDeInternacionLogica.getCuidadoDeInternacionHTML(
                        tratamientoYPractica.getCuidadoDeInternacion());
            }

        tratamientoYPracticaHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">TRATAMIENTO Y PRÁCTICA</font><br><br><hr /> "
                    + "<hr /><font size=\"3\" face=\"arial\" color=\"blue\">Fecha: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    CapaPresentacion.imprimirFecha(tratamientoYPractica.
                    getFechaTratamientoYPractica()) + " - " +
                    tratamientoYPractica.getHoraTratamientoYPractica() + "</font><br><hr />" +
                    tratamientoQuirurgicoHTML +
                    cuidadoDeInternacionHTML + "</font><br><br>";
        } else {
            tratamientoYPracticaHTML = "<font size=\"3\" face=\"arial\" color=\"blue\">TRATAMIENTO Y PRÁCTICA</font><br><br> " +
                    "<hr /><font size=\"3\" face=\"arial\">No posee</font><br></font><hr />";
        }
        return tratamientoYPracticaHTML;
    }

}
